package service;
import java.util.Arrays;
import domain.dto.*;
import domain.entity.*;
import domain.vo.*;
public class DeptService {
    /**
     * 实体对象存储量
     */
    public static int DATA_SIZE = 100;
    /**
     * 实体对象存储数组
     */
    public static Dept[] data = new Dept[DATA_SIZE + 1];
    /**
     * ID 计数器
     */
    public static int idCounter = 1;

    /**
     * 根据部⻔传输对象（DeptDto）和部⻔ID创建⼀个新的部⻔实体对象（Dept）。
     *
     * @param dto 传⼊的部⻔传输对象，包含部⻔的基本信息（如名称和电话）。
     * @param id 为新创建的部⻔实体指定的唯⼀ID。
     * @return 返回创建的部⻔实体对象（Dept）。
     */
    public static Dept createEntity(DeptDto dto, int id) {
        // 使⽤传⼊的部⻔传输对象（DeptDto）中的信息创建⼀个新的部⻔实体对象（Dept）
        Dept dept = new Dept(dto.name, dto.phone);
        // 为新创建的部⻔实体对象分配唯⼀的ID
        dept.id = id;
        // 返回创建的部⻔实体对象
        return dept;
    }

    public static void updateEntity(DeptDto dto, Dept dept) {
        // 使⽤传⼊的部⻔传输对象（DeptDto）中的新名称更新部⻔实体对象的名称
        dept.name = dto.name;
        // 使⽤传⼊的部⻔传输对象（DeptDto）中的新电话更新部⻔实体对象的电话
        dept.phone = dto.phone;
    }

    public static Result create(DeptDto dto) {
        // 检查当前存储的部⻔数量是否超过最⼤容量
        if (idCounter > DATA_SIZE) {
            // 如果超过最⼤容量，返回失败结果
            return Result.failure("创建失败，超出存储容量");
        }
        // 创建新的部⻔对象，使⽤传⼊的部⻔名称和电话
        Dept dept = createEntity(dto, idCounter++);
        // 将新部⻔对象存储到数据数组中
        data[dept.id] = dept;
        // 返回成功结果
        return Result.success("创建成功", null);
    }
    public static DeptVo convertToVo(Dept dept) {

        return new DeptVo(dept.id, dept.name, dept.phone);
    }


    public static Result list() {
        // 创建⼀个临时数组，⽤于存储有效的部⻔数据
        DeptVo[] temp = new DeptVo[DATA_SIZE];
        // ⽤于记录临时数组的实际存储⻓度
        int length = 0;
        // 遍历存储部⻔的原始数据数组
        for (int i = 1; i < idCounter; i++) {
            // 如果当前部⻔数据不为空，则将其添加到临时数组中
            if (data[i] != null) {
                temp[length++] = convertToVo(data[i]);
            }
        }
        // 返回查询成功的结果，并返回临时数组的有效部分
        return Result.success("查询成功", Arrays.copyOf(temp, length));
    }

    public static boolean existsById(int id) {
        return id >= 1 && id < idCounter && data[id] != null;
    }

    public static Result update(DeptDto dto, int id) {
        // 检查提供的部⻔ ID 是否有效：ID ⼩于 1，ID 超出有效范围，或者该 ID 对应的数据为空
        if (!existsById(id)) {
            return Result.failure("更新失败，不存在该数据");
        }
        if (id < 1 || id >= idCounter || data[id] == null) {
            // 如果 ID ⽆效，返回更新失败的结果
            return Result.failure("更新失败，不存在该数据");
        }
        // 获取指定 ID 的部⻔对象
        Dept dept = data[id];
        // 更新部⻔的名称和电话
        dept.name = dto.name;
        //dept.phone = dto.phone;
        updateEntity(dto, dept);
        // 返回更新成功的结果
        return Result.success("更新成功", null);
    }

    public static Result delete(int id) {
        // 检查提供的部⻔ ID 是否有效：ID ⼩于 1，ID 超出有效范围，或者该 ID 对应的数据为空
        if (!existsById(id)) {
            return Result.failure("删除失败，不存在该数据");
        }
        if (id < 1 || id >= idCounter || data[id] == null) {
            // 如果 ID ⽆效，返回删除失败的结果
            return Result.failure("删除失败，不存在该数据");
        }
        if (UserService.deptInUse(id)) {
            return Result.failure("删除失败，有⽤户属于该部⻔，不能删除");
        }
        // 将指定 ID 的部⻔数据置为 null，表示删除该数据
        data[id] = null;
        // 返回删除成功的结果
        return Result.success("删除成功", null);
    }

    public static Dept findById(int id) {
        // 调⽤ existsById ⽅法检查该 ID 对应的部⻔是否存在
        if (existsById(id)) {
            // 如果存在，返回该 ID 对应的部⻔实体对象
            return data[id];
        }
        // 如果不存在，返回 null
        return null;
    }

}